package com.ny.contorller;
import com.ny.entity.Result;
import com.ny.entity.User;
import com.ny.service.UserService;
import com.ny.util.JwtUtil;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@Validated // 开启参数校验（否则@NotBlank等注解不生效）
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private JwtUtil jwtUtil;
    Map<String,Object> map=new HashMap<>();
    @GetMapping("/findAll") // 使用更规范的GET请求
    public Result<List<User>> findAllUsers() {
        try {
            List<User> users = userService.findAll();
            return Result.success("查询所有用户成功", users);
        } catch (Exception e) {
            return Result.error("查询用户失败：" + e.getMessage());
        }
    }
    @GetMapping("/findUserByNickName") // 使用更规范的GET请求
    public Result<User> findUserByNickName( @RequestParam String nickName) {
        try {
            User user = userService.findUserByNickName(nickName);
            return Result.success("查询成功", user);
        } catch (Exception e) {
            return Result.error("查询用户失败：" + e.getMessage());
        }
    }

    @PostMapping("/login")
    public Result<Map<String, Object>> login(
            @RequestParam String username,
            @RequestParam String password) {
        try {
            // 1. 校验用户名/密码非空（保持不变）
            if (username == null || username.trim().isEmpty()) {
                return Result.error("用户名不能为空", 400);
            }
            if (password == null || password.trim().isEmpty()) {
                return Result.error("密码不能为空", 400);
            }

            // 2. 调用新的登录校验方法（校验加密密码）
            User user = userService.findUserByUsername(username);
            boolean isLoginSuccess = userService.checkLogin(username, password);

            if (isLoginSuccess && user != null) {
                // 3. 登录成功，生成Token（逻辑不变）
                String token = jwtUtil.generateToken(username);
                jwtUtil.storeToken(token, username);
                map.put("token", token);
                map.put("user", user);
                return Result.success("登录成功", map);
            } else {
                return Result.error("用户名或密码错误", 401);
            }
        } catch (Exception e) {
            return Result.error("登录失败：" + e.getMessage(), 500);
        }
    }
    // 新增：用户注册接口（用@Valid校验User参数，@RequestBody接收JSON格式）
    @PostMapping("/register")
    public Result<Void> register(@Valid @RequestBody User user) {
        try {
            userService.register(user);
            return Result.success("注册成功", null); // 注册成功无返回数据，data为null
        } catch (IllegalArgumentException e) {
            // 捕获“用户名已存在”等自定义异常（Assert抛出的异常）
            return Result.error(e.getMessage(), 400);
        } catch (Exception e) {
            // 捕获其他未知异常（如数据库错误）
            return Result.error("注册失败：" + e.getMessage(), 500);
        }
    }
    /**
     * 发送邮箱号重置验证码
     * 请求示例：POST /auth/sendResetCode?email=xxx@qq.com
     */
    @PostMapping("/sendResetCode")
    public Result<Void> sendResetCode(
            @RequestParam @NotBlank(message = "邮箱不能为空")
            @Email(message = "邮箱格式不正确") String email) {
        try {
            userService.sendResetCode(email);
            return Result.success("验证码已发送至您的邮箱，请查收（有效期5分钟）", null);
        } catch (IllegalArgumentException e) {
            // 捕获“邮箱未注册”等业务异常
            return Result.error(e.getMessage(), 400);
        } catch (Exception e) {
            // 捕获邮件发送失败等系统异常
            return Result.error("验证码发送失败：" + e.getMessage(), 500);
        }
    }

    /**
     * 验证验证码并重置密码
     * 请求示例：POST /auth/resetPassword
     * 请求体：{"email":"xxx@qq.com","code":"123456","newPassword":"new123456"}
     */
    @PostMapping("/resetPassword")
    public Result<Void> resetPassword(
            @Valid @RequestBody ResetPasswordDTO resetDTO) {
        try {
            userService.resetPassword(
                    resetDTO.getEmail(),
                    resetDTO.getCode(),
                    resetDTO.getNewPassword()
            );
            return Result.success("密码重置成功，请使用新密码登录", null);
        } catch (IllegalArgumentException e) {
            // 捕获“验证码错误/过期”“新密码格式错误”等业务异常
            return Result.error(e.getMessage(), 400);
        } catch (Exception e) {
            // 捕获密码更新失败等系统异常
            return Result.error("密码重置失败：" + e.getMessage(), 500);
        }
    }

    // ---------------- 内部DTO：封装重置密码请求参数 ----------------
    /**
     * 重置密码请求参数DTO（避免直接使用User实体，只传递必要参数）
     */
    @Setter
    @Getter
    public static class ResetPasswordDTO {
        // Lombok的@Getter@Setter（若未用Lombok，需手动生成）
        @NotBlank(message = "邮箱不能为空")
        @Email(message = "邮箱格式不正确")
        private String email;

        @NotBlank(message = "验证码不能为空")
        private String code;

        @NotBlank(message = "新密码不能为空")
        @Length(min = 6, max = 20, message = "新密码长度需在6-20位之间")
        private String newPassword;

    }
}
